package app;

import java.awt.Image;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.ListIterator;

import org.jasypt.util.text.BasicTextEncryptor;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class Config extends javax.swing.JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;


	/**Estructura del archivo de configuracion:
	 * 1.- Version del programa
	 * 2.- Urls de las comboImagenes
	 * 3.- Descripcion de las comboImagenes
	 * 4.- Codigos preconfigurados
	 * 5.- Path del navegador
	 * 6.- Configuracion pegado inteligente
	 * 7.- Configuracion codigo autogenerado
	 * 8.- Configuraciones varias (arreglo booleano)
	 * 9.- Configuracion usuario y pass
	 * 
	 */
	
	
	
	Image img=null;
	
	private String passEncript="postascii";
	private String cod1="";
	private String cod2="";
	private String cod3="";
	private String cod4="";
	private BasicTextEncryptor textEncryptor;
	ArrayList<String> cods = new ArrayList<String>();
	File configuracion;
	public ArrayList<String> urls = new ArrayList<String>();
	protected int timerCont;

	ArrayList<String> descs = new ArrayList<String>();
	ArrayList<String> urlsTemp = new ArrayList<String>();
	ArrayList<String> descsTemp = new ArrayList<String>();
	ArrayList<String> fuentesP = new ArrayList<String>();
	protected ArrayList<String[]> comunidades = new ArrayList<String[]>();
	
	
	protected String browser="";
	protected ArrayList<String[]> estilos;
	protected ArrayList<String[]> listaImagenes;
	
	protected String[] fuentes;
	protected String[] colores;
	protected String[] sizes;
	
	
	/*
	 * formato:
	 * 0: descripcion de la imagen
	 * 1: url de la imagen
	 */
	
	protected String[] usrPass;
	String version;
	String carpeta,config,separador;
	protected Main main;
	
	/*
	 * [0] Centrar imagenes
	 * [1] Links por debajo
	 * [2] Activar al inicio (solo Pegado Inteligente)
	 */
	protected boolean[] pegadoIntel;
	protected boolean[] codigoAuto;
	//
	protected boolean[] arregloOpciones = new boolean[10];
	/*0: chequear actualizaciones al inicio
	 *1: nro de lineas en el panel de edicion 
	 */
	
	
	public boolean checkUpdate() {
		return arregloOpciones[0];
	}
	
	public boolean checkNumerosLineas() {
		return arregloOpciones[1];
	}
	
	public ArrayList<String> getFuentesP(){
		return fuentesP;
	}
	
	
	
	public Config(Main m) {
		
		main=m;
		separador=System.getProperty("file.separator");
		if (esLinux()) carpeta=System.getProperty("user.home")+separador+".postinga";
		else carpeta=System.getProperty("user.home")+separador+"postinga";
	    config=carpeta+separador+"config";
	    
	    configuracion = new File(config);
		pegadoIntel = new boolean[] {false,false,false,false,false,false,false,false,false,false};
		codigoAuto = new boolean[] {false,false,false,false,false,false,false,false,false,false};
		usrPass = new String[2];
		usrPass[0]="";
		usrPass[1]="";
		estilos = new ArrayList<String[]>();
		listaImagenes = new ArrayList<String[]>();
		textEncryptor = new BasicTextEncryptor();
 		textEncryptor.setPassword(passEncript);
		
		
		
		
	    if (configuracion.exists())
			try {
		        cargarConfig();
			} catch (Exception e) {
				
				e.printStackTrace();
			}
	    
			urlsTemp=(ArrayList<String>) urls.clone();
			descsTemp=(ArrayList<String>) descs.clone();
		
			
	}
	
	
	
	
	
	public boolean existeConfig() {
		return configuracion.exists();
	}
	
	
	
	
	public boolean esLinux(){
		 
		String os = System.getProperty("os.name").toLowerCase();
		//linux o unix
	    return (os.indexOf( "nix") >=0 || os.indexOf( "nux") >=0);
 
	}
	
	public boolean[] getCodigoAuto() {
		return codigoAuto;
	}
	
	public boolean[] getPegadoIntel() {
		return pegadoIntel;
	}
	
	public void setPegadoIntel(boolean[] b){
		pegadoIntel=b;
	}
	
	public void setCodigoAuto(boolean[] b){
		codigoAuto=b;
	}
	
	public boolean getActivarInicioPI(){
		return pegadoIntel[2];
	}
	
	public boolean getIncluirLinksPI(){
		return pegadoIntel[1];
	}
	
	public boolean getCentrarImagenesPI(){
		return pegadoIntel[0];
	}
	
	public boolean getCentrarImagenesCA(){
		return codigoAuto[0];
	}
	
	public boolean getIncluirLinksCA(){
		return codigoAuto[1];
	}
	
	
	public String getUsuario() {
		return usrPass[0];
	}
	
	public String getContrasenia() {
		return usrPass[1];
	}
	
	
	public void conectar(Main m){
		main=m;
		
	}
	
	public String getPath(){
		if (esLinux()) return System.getProperty("user.home")+separador+".postinga"+separador;
		else return System.getProperty("user.home")+separador+"postinga"+separador;
			
	}
	
	
	
	
	
	public void cargarConfig() throws Exception {
		
		    FileInputStream fis = new FileInputStream(config);
            ObjectInputStream ois = new ObjectInputStream(fis);
           try {
        	  version=(String) ois.readObject();
        	  float numVersion = Float.parseFloat(version);
        	  System.out.println("Version del archivo de configuracion: "+numVersion);
        	  
           	  urls = (ArrayList<String>) ois.readObject(); 
        	  System.out.println("Imagenes cargadas");
        	  descs = (ArrayList<String>) ois.readObject();
              System.out.println("Descripciones cargadas");
              
              listaImagenes=convert();
              System.out.println("Conversion completa");
             
              cods = (ArrayList<String>) ois.readObject();
              System.out.println("Codigos cargados");
              if (!cods.isEmpty()) {
                  cod1=cods.get(0);
                  cod2=cods.get(1);
                  cod3=cods.get(2);
                  cod4=cods.get(3);                  
                  }
              browser=(String) ois.readObject();
              System.out.println("Browser cargado: "+browser);
              
              
              //estilos disponibles a partir de la version 0.7
              if (Float.compare(numVersion,(float) 0.7)>=0)
              {
            	  estilos=(ArrayList<String[]>) ois.readObject();
            	  System.out.println("Estilos cargados");
              }
              
             
              boolean[] a= (boolean[]) ois.readObject();
              if (a!=null) pegadoIntel=a;
              boolean[] b= (boolean[]) ois.readObject();
              if (a!=null) codigoAuto=b;
                           
              System.out.println("Config de autogenerado y pegado inteligente cargada");
              
              /*if (Float.compare(numVersion,(float) 0.8)>=0)
              { */
              arregloOpciones=(boolean[]) ois.readObject();
              System.out.println("Configuraciones generales cargadas");
             // }
              
              	fuentesP=(ArrayList<String>) ois.readObject();
              	System.out.println("Fuentes personalizadas cargadas");
              	
             String[] usrPassTmp = (String[]) ois.readObject();
             usrPass[0]=textEncryptor.decrypt(usrPassTmp[0]);
             usrPass[1]=textEncryptor.decrypt(usrPassTmp[1]);
             System.out.println("Datos de usuario y contraseña cargados");
             
             comunidades=(ArrayList<String[]>) ois.readObject();
             System.out.println("Informacion de comunidades cargadas");
             
             timerCont=(Integer) ois.readObject();
             System.out.println("Informacion del timer cargada");
             main.setAutoTimer(timerCont);
             
           } 
           catch (java.io.EOFException cnfe) {
        	   System.out.println("Error en la carga de configuracion: EOFException");
           }
           catch (ClassCastException exc) {
               
           }
           
           finally {
           fis.close();
           }
       
	}
	
	
	
	
	public ArrayList<String[]> getEstilos() {
		if (estilos==null)
		{
			estilos= new ArrayList<String[]>();
		}
		return estilos;
	}
	

	
	
	//convierte el formato obtenido desde la configuracion (2 arreglos) a uno solo todo integrado

	private ArrayList<String[]> convert (){
		ArrayList<String[]> temp = new ArrayList<String[]>();
				
		for (int i=0;i<urls.size();i++)
		{
			String[] arreglo = new String[2];
			arreglo[0]=new String (descs.get(i));
			arreglo[1]=new String(urls.get(i));
			temp.add(arreglo);
			
		}
		
		return temp;
		
	}
	
	

	
	
	private void convert2old() {
		urls.clear();
		descs.clear();
		
		for (int i=0;i<listaImagenes.size();i++){
					
			descs.add(listaImagenes.get(i)[0]);
			urls.add(listaImagenes.get(i)[1]);
		}
		
		
	}
	
	
	public ArrayList<String[]> getImagenes(){
		if (listaImagenes==null)
		{
			listaImagenes= new ArrayList<String[]>();
		}
		return listaImagenes;
	}
	
	public ArrayList<String[]> getComunidades(){
		if (comunidades==null)
		{
			comunidades= new ArrayList<String[]>();
		}
		return comunidades;
	}
	public void guardarConfig() throws IOException{
			    
	    File fileCarp=new File(carpeta);
	    boolean existecarpeta = fileCarp.exists();
	    if (!existecarpeta) if (fileCarp.mkdir())
	    {
	    	
	    }
		
			
			 //Guarda los codigos predefinidos
			 cods.clear();
			 cods.add(cod1);
			 cods.add(cod2);
			 cods.add(cod3);
			 cods.add(cod4);
			 
			
			 			 		 
			 FileOutputStream fos = new FileOutputStream(config);
	         ObjectOutputStream oos = new ObjectOutputStream(fos);
	         
	         
	        
	        //guarda la version del programa
	       	 oos.writeObject(main.getVersion());
	       	System.out.println("Version guardada: "+main.getVersion());
	       	 
	       	convert2old();
	         //guarda las urls de las comboImagenes
	        oos.writeObject(urls);
	        System.out.println("Imagenes guardadas");
	      
	         //guarda las descripciones de las comboImagenes
	         oos.writeObject(descs);
	         System.out.println("Descripciones guardadas");
	       	
	       	 //oos.writeObject(listaImagenes);
	       	 
	         
	       	 //guarda los codigos predefinidos
	         oos.writeObject(cods);
	         System.out.println("Codigos guardados");
	        
	         //guarda el path del navegador
	         oos.writeObject(browser);
	         System.out.println("Navegador guardado");
	         
	         //guarda el arreglo de estilos
	         oos.writeObject(estilos);
	         System.out.println("Estilos guardados");
	         
	       //guarda configuracion pegado Inteligente
	         oos.writeObject(pegadoIntel);
	         
	         
	       //guarda configuracion Codigo Autogenerado
	         oos.writeObject(codigoAuto);	 
	         System.out.println("Preferencias de pegado Inteligente guardadas");
	         
	         //guarda configuracion Codigo Autogenerado
	         oos.writeObject(arregloOpciones);	 
	         System.out.println("Perfil guardado");
	         
	         //guarda configuracion de Fuentes Personalizadas
	         oos.writeObject(fuentesP);
	         System.out.println("Fuentes personalizadas guardadas");
	         
	 		usrPass[0]=textEncryptor.encrypt(usrPass[0]);
	 		usrPass[1]=textEncryptor.encrypt(usrPass[1]);
	 			         
	 		oos.writeObject(usrPass);
	         System.out.println("Usuario y contraseña guardados");
	         
	         oos.writeObject(comunidades);
	         System.out.println("Informacion de comunidades guardada");
	         
	         oos.writeObject(timerCont);
	         System.out.println("Timer guardado");
	       main.setAutoTimer(timerCont);
	       main.rellenarEstilos();
	       main.rellenarImagenes();
	       main.insertarFuentes();
	       main.rellenarComunidades();
	      
	     
	         fos.close();
	         System.out.println("<----Configuracion almacenada---->");
	         
	         
	         
		 
	}
	
	
	
	
	public String cargarCod(int i){
		switch (i)		{
		case 1:return cod1;
		case 2:return cod2;
		case 3:return cod3;
		case 4:return cod4;
		}
		return "";
	}
	
	
	public void guardarCod(String str, int i){
		
		switch (i) {
		case 1:cod1=str;break;
		case 2:cod2=str;break;
		case 3:cod3=str;break;
		case 4:cod4=str;break;
		}
		try {
			this.guardarConfig();
		} catch (IOException e) {
			
		}
	}

	
	
	
	
public String getImage(int index){
	return (String)urls.get(index-1);
}
	
public String getBrowser(){
	return browser;
}
	

public void setBrowser(String str){
	browser=str;
}


public void setEstilos(ArrayList<String[]> array) {
	estilos=array;
}

public void setImgs(ArrayList<String[]> array) {
	listaImagenes=array;
}

public String[] getStringFuentes() {
	return main.getStringFuentes();
}

public String[] getStringColores() {
	return main.getStringColores();
}

public String[] getStringSizes() {
	return main.getStringSizes();
}

			
public void print() {
	
ListIterator<String> litr = urls.listIterator();
while (litr.hasNext()) {
  String element = litr.next();
  System.out.print(element + " ");
}
System.out.println();
}




public void print2() {
	
	ListIterator<String> litr = descs.listIterator();
	while (litr.hasNext()) {
	  String element = litr.next();
	  System.out.print(element + " ");
	}
	System.out.println();
	}


}
